/**
 * @file pid.h
 * @brief PID控制器头文件，用于电机速度环控制
 */

#ifndef PID_H_
#define PID_H_

#include <stdint.h>

/**
 * @brief PID控制器结构体
 */
typedef struct {
    float Kp;         // 比例系数
    float Ki;         // 积分系数
    float Kd;         // 微分系数
    float target;     // 目标值
    float prev_error; // 上一次误差
    float integral;   // 积分累计
    float derivative; // 微分项
    float output;     // 输出值
    float output_max; // 输出上限
    float output_min; // 输出下限
    uint8_t enabled;  // 使能状态
} PID_t;

/**
 * @brief 初始化PID控制器
 * 
 * @param pid PID控制器指针
 * @param Kp 比例系数
 * @param Ki 积分系数
 * @param Kd 微分系数
 * @param out_min 输出下限
 * @param out_max 输出上限
 */
void PID_Init(PID_t *pid, float Kp, float Ki, float Kd, float out_min, float out_max);

/**
 * @brief 设置PID目标值
 * 
 * @param pid PID控制器指针
 * @param target 目标值
 */
void PID_SetTarget(PID_t *pid, float target);

/**
 * @brief 计算PID输出
 * 
 * @param pid PID控制器指针
 * @param measured 当前测量值
 * @return float PID计算后的输出值
 */
float PID_Compute(PID_t *pid, float measured);

/**
 * @brief 重置PID控制器
 * 
 * @param pid PID控制器指针
 */
void PID_Reset(PID_t *pid);

/**
 * @brief 设置PID控制器参数
 * 
 * @param pid PID控制器指针
 * @param Kp 比例系数
 * @param Ki 积分系数
 * @param Kd 微分系数
 */
void PID_SetParams(PID_t *pid, float Kp, float Ki, float Kd);

/**
 * @brief 启用PID控制器
 * 
 * @param pid PID控制器指针
 */
void PID_Enable(PID_t *pid);

/**
 * @brief 禁用PID控制器
 * 
 * @param pid PID控制器指针
 */
void PID_Disable(PID_t *pid);

#endif /* PID_H_ */ 